//
//  IJSFilesManager.m
//  IJSOCproject
//
//  Created by shange on 2017/4/27.
//  Copyright © 2017年 jinshan. All rights reserved.
//

#import "IJSFilesManager.h"


@interface IJSFilesManager ()

@end


@implementation IJSFilesManager


// 计算文件的大小
+ (void)getFileSizeWithDirectoryPath:(NSString *)directoryPath completion:(completion)completeHandler
{
    //     1,   创建管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    //      判断文件是否是文件夹
    BOOL isDirectory; //  1 表示文件夹  0 表示单个文件
    BOOL isFileExist = [manager fileExistsAtPath:directoryPath isDirectory:&isDirectory];
    // 1   单个文件名字
    if (!isDirectory && isFileExist) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSError *error = nil;
            NSDictionary *attrs = [manager attributesOfItemAtPath:directoryPath error:&error];
            //        获取文件尺寸
            NSInteger fileSize = [attrs fileSize];
            dispatch_async(dispatch_get_main_queue(), ^{
                completeHandler(fileSize);
            });
        });
    }
    //  2  文件夹形式
    else {
        if (!isDirectory || !isFileExist) {
            //    不存在就抛异常
            //        name 异常的名称
            NSException *exception = [NSException exceptionWithName:@"pathError" reason:@"获取文件大小中,文件夹路径传错了,或者路径不存在" userInfo:nil];
            [exception raise]; //抛异常
        }

        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            //    2, 获取所有的子路径,包括所有的二级三级路径等等
            NSArray *subPaths = [manager subpathsAtPath:directoryPath];
            NSInteger totalSize = 0;
            //   3, 遍历所有的文件
            for (NSString *fileItem in subPaths) {
                // 获取文件全路径
                NSString *filePath = [directoryPath stringByAppendingPathComponent:fileItem];
                if ([fileItem containsString:@".DC"]) continue;
                //            获取文件属性  attributesize 根据文件获取属性
                NSError *error = nil;
                NSDictionary *attrs = [manager attributesOfItemAtPath:filePath error:&error];
                //        获取文件尺寸
                NSInteger fileSize = [attrs fileSize];
                totalSize += fileSize;
            }
            //        回到主线程 刷新UI
            dispatch_async(dispatch_get_main_queue(), ^{
                completeHandler(totalSize);
            });
        });
    }
}

+ (void)cleanAllCacheFile
{
    //    文件管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    //      获取所有的chche 文件的路径
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        //    获取cache  文件夹下的所有的文件,不包括二级子路径
        NSError *error = nil;
        NSArray *subItem = [manager contentsOfDirectoryAtPath:cachePath error:&error];
        //    遍历数组删除
        for (NSString *subPath in subItem) {
            //    拼接完整的路径
            NSString *filePaths = [cachePath stringByAppendingPathComponent:subPath];
            //        删除路径下的所有的文件
            NSError *error = nil;
            [manager removeItemAtPath:filePaths error:&error];
        }
    });
}

#pragma mark 计算文件大小,删除指定文件,返回剩余文件大小
+ (void)cleanFileWithFilePath:(NSString *)filePath surplusOfSize:(completion)fileSzieHandler
{
    //     1,   创建管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    //      判断文件是否是文件夹
    BOOL isDirectory; //  1 表示文件夹  0 表示单个文件
    BOOL isFileExist = [manager fileExistsAtPath:filePath isDirectory:&isDirectory];
    if (!isDirectory && isFileExist) // 1   单个文件名字
    {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            NSError *error = nil;
            [manager removeItemAtPath:filePath error:&error];
            NSDictionary *attrs = [manager attributesOfItemAtPath:filePath error:&error];
            //        获取文件尺寸
            NSInteger fileSize = [attrs fileSize];
            dispatch_async(dispatch_get_main_queue(), ^{
                fileSzieHandler(fileSize);
            });
        });
    } else { //  2  文件夹形式,遍历子文件
        if (!isDirectory || !isFileExist) {
            //    不存在就抛异常
            //        name 异常的名称
            NSException *exception = [NSException exceptionWithName:@"pathError" reason:@"获取文件大小中,文件夹路径传错了,或者路径不存在" userInfo:nil];
            [exception raise]; //抛异常
        } else {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{

                NSError *error = nil;
                __block NSInteger surplusFileSize = 0; // 剩余文件
                                                       //                删除文件
                                                       //                寻找文件夹,直接删除文件夹(只包括二级文件)
                NSArray *subFolder = [manager contentsOfDirectoryAtPath:filePath error:&error];
                for (NSString *folderName in subFolder) {
                    //    拼接完整的路径
                    NSString *folderPaths = [filePath stringByAppendingPathComponent:folderName];
                    //        删除路径下的所有的文件
                    NSError *error = nil;
                    [manager removeItemAtPath:folderPaths error:&error];

                    //                    计算剩余文件的总和(包括二级 三级文件路径)
                    NSArray *allFile = [manager subpathsAtPath:filePath];
                    for (NSString *fileName in allFile) {
                        //                        拼接路径
                        NSString *lastFilePath = [filePath stringByAppendingPathComponent:fileName];
                        NSDictionary *attrs = [manager attributesOfItemAtPath:lastFilePath error:&error];
                        surplusFileSize += [attrs fileSize];
                    }
                    dispatch_async(dispatch_get_main_queue(), ^{
                        fileSzieHandler(surplusFileSize);
                        surplusFileSize = 0;
                    });
                }
            });
        }
    }
}


@end
